package net.zwj;

import java.lang.reflect.Method;

public class JavaClassExecuter {
	
	public final static String HACK_NAME="net/zwj/HackSystem";
	/**
	 * 执行外部传过来的代表一个Java类的Byte数组
	 * 将输入类的byte数组中代表java.lang.System的CONSTANT_Utf8_info常量修改为劫持后的
	 * HacKSystem类
	 * 执行该类中的main方法,输出结果为该类向System.out/err输出的信息
	 * @param classByte 表示一个Java类的Byte数组
	 * @return 执行结果
	 */
	public static String execute(byte[] classByte){
		HackSystem.clearBuffer();
		ClassModifier cm = new ClassModifier(classByte);
		byte[] modiBytes = cm.modifyUTF8Constant("java/lang/System",HACK_NAME);
		HotSwapClassLoader loader = new HotSwapClassLoader();
		Class<?> clazz = loader.loadBytes(modiBytes);
		try{
			Method method = clazz.getMethod("main", new Class[]{String[].class});
			method.invoke(null, (Object[])new String[]{null});
			
		}catch (Exception e) {
			e.printStackTrace(HackSystem.err);
		}
		return HackSystem.getBufferString();
	}
}
